package design.mode.effective_java.chapter7.item47;

import java.util.Collections;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @author ZhongMingde on 2021/8/30
 */

public class SubLists {
    /**
     * Stream.concat()创建一个懒惰连接的流，其元素是第一个流的所有元素，后跟第二个流的所有元素。
     * Stream.of() 返回包含单个元素的序列 Stream 。
     *
     * @param list
     * @param <E>
     * @return
     */
    public static <E> Stream<List<E>> of(List<E> list) {
        return Stream.concat(Stream.of(Collections.emptyList()), prefixes(list).flatMap(SubLists::suffixes));
    }

    /**
     * IntStream.rangeClosed(int startInclusive, int endInclusive)返回 startInclusive （含）的序列 IntStream至 endInclusive （含），增量为 1 。
     * IntStream.mapToObj(IntFunction<? extends U> mapper) 返回一个对象值Stream其中包含将给定函数应用于流的元素的结果
     * @param list
     * @param <E>
     * @return
     */
    private static <E> Stream<List<E>> prefixes(List<E> list) {
        return IntStream.rangeClosed(1, list.size()).mapToObj(value -> list.subList(0, value));
    }

    private static <E> Stream<List<E>> suffixes(List<E> list) {
        return IntStream.range(0, list.size()).mapToObj(start -> list.subList(start, list.size()));
    }
}
